home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / Updates / Datatypes / JPEG-DT / Source / libbase.c < prev    next >
C/C++ Source or Header  |  1999-11-14  |  4KB  |  196 lines

  1. #include <clib/alib_protos.h>
  2. #include <pragma/exec_lib.h>
  3. #include <pragma/intuition_lib.h>
  4. #include <dos/dos.h>
  5. #include <exec/resident.h>
  6. #include "class.h"
  7.  
  8. #define VERSION 43
  9. #define REVISION 1
  10.  
  11. struct ClassBase:Library
  12. {
  13. BPTR cb_SegList;
  14. IClass *cb_Class;
  15. SignalSemaphore cb_Lock;
  16. };
  17.  
  18. extern APTR Dispatcher;
  19. extern ULONG InitTab[];
  20. extern APTR LibVectors[];
  21. extern char LibName[];
  22. extern char LibId[];
  23.  
  24. ClassBase *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase);
  25. ClassBase *LibOpen(register __a6 ClassBase *cb);
  26. ULONG LibClose(register __a6 ClassBase *cb);
  27. ULONG LibExpunge(register __a6 ClassBase *cb);
  28. IClass *ObtainClass(register __a6 ClassBase *cb);
  29.  
  30. BOOL L_OpenLibs();
  31. void L_CloseLibs();
  32. IClass *InitClass(ClassBase *cb);
  33.  
  34. static LONG LibExtFunc()
  35. {
  36. return -1;
  37. }
  38.  
  39. static Resident RomTag=
  40. {
  41. RTC_MATCHWORD,
  42. &RomTag,
  43. &RomTag+sizeof(RomTag),
  44. RTF_AUTOINIT,
  45. VERSION,
  46. NT_LIBRARY,
  47. 0,
  48. LibName,
  49. LibId,
  50. &InitTab
  51. };
  52.  
  53. char LibName[]="jpeg.datatype";
  54. char LibId[]="$VER:jpeg.datatype 43.1 (13.11.99) © 1999 by Achim Stegemann\n";
  55.  
  56. APTR LibVectors[]=
  57. {
  58. LibOpen,
  59. LibClose,
  60. LibExpunge,
  61. LibExtFunc,
  62. ObtainClass,
  63. APTR(-1),
  64. };
  65.  
  66. ULONG InitTab[]=
  67. {
  68. sizeof(ClassBase),
  69. ULONG(LibVectors),
  70. 0,
  71. ULONG(LibInit)
  72. };
  73.  
  74. Library *SysBase;
  75. Library *DOSBase;
  76. Library *IntuitionBase;
  77. Library *GfxBase;
  78. Library *UtilityBase;
  79. Library *DataTypesBase;
  80. Library *SuperClassBase;
  81. Library *JpegBase;
  82. Library *RenderBase;
  83.  
  84. ClassBase *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase)
  85. {
  86. SysBase=sysbase;
  87. cb->lib_Revision=REVISION;
  88. cb->cb_SegList=Segment;
  89. InitSemaphore(&cb->cb_Lock);
  90. return cb;
  91. }
  92.  
  93. ClassBase *LibOpen(register __a6 ClassBase *cb)
  94. {
  95. ClassBase *ret=0;
  96. cb->lib_Flags&=~LIBF_DELEXP;
  97. ObtainSemaphore(&cb->cb_Lock);
  98. if(!cb->cb_Class)
  99.     {
  100.     if(L_OpenLibs())
  101.         {
  102.         if(cb->cb_Class=InitClass(cb)) ret=cb;
  103.         }
  104.     }
  105. else ret=cb;
  106. if(ret) cb->lib_OpenCnt++;
  107. ReleaseSemaphore(&cb->cb_Lock);
  108. return ret;
  109. }
  110.  
  111. ULONG LibClose(register __a6 ClassBase *cb)
  112. {
  113. if(cb->lib_OpenCnt) cb->lib_OpenCnt--;
  114. return (!cb->lib_OpenCnt&&cb->lib_Flags&LIBF_DELEXP)?LibExpunge(cb):0;
  115. }
  116.  
  117. ULONG LibExpunge(register __a6 ClassBase *cb)
  118. {
  119. if(!cb->lib_OpenCnt)
  120.     {
  121.     if(cb->cb_Class) 
  122.         {
  123.         if(!FreeClass(cb->cb_Class))
  124.             {
  125.             AddClass(cb->cb_Class);
  126.             return 0;
  127.             }
  128.         }
  129.     L_CloseLibs();
  130.     Remove(cb);
  131.     FreeMem((BYTE *)cb-cb->lib_NegSize,cb->lib_NegSize+cb->lib_PosSize);
  132.     return cb->cb_SegList;
  133.     }
  134. else cb->lib_Flags|=LIBF_DELEXP;
  135. return 0;
  136. }
  137.  
  138. IClass *InitClass(ClassBase *cb)
  139. {
  140. IClass *cl;
  141. if(cl=MakeClass(LibName,"picture.datatype",0,sizeof(Data),0))
  142.     {
  143.     cl->h_Entry=&HookEntry;
  144.     cl->h_SubEntry=&Dispatcher;
  145.     cl->cl_UserData=ULONG(cb);
  146.     AddClass(cl);
  147.     }
  148. return cl;
  149. }
  150.  
  151. BOOL L_OpenLibs()
  152. {
  153. if(DOSBase=OpenLibrary("dos.library",39))
  154.     {
  155.     if(GfxBase=OpenLibrary("graphics.library",39))
  156.         {
  157.         if(IntuitionBase=OpenLibrary("intuition.library",39))
  158.             {
  159.             if(UtilityBase=OpenLibrary("utility.library",39))
  160.                 {
  161.                 if(DataTypesBase=OpenLibrary("datatypes.library",39))
  162.                     {
  163.                     if(SuperClassBase=OpenLibrary("datatypes/picture.datatype",39))
  164.                         {
  165.                         if(JpegBase=OpenLibrary("jpeg.library",5))
  166.                             {
  167.                             if(RenderBase=OpenLibrary("render.library",30)) return 1;
  168.                             }
  169.                         }
  170.                     }
  171.                 }
  172.             }
  173.         }
  174.     }
  175. L_CloseLibs();
  176. return 0;
  177. }
  178.  
  179. void L_CloseLibs()
  180. {
  181. CloseLibrary(DOSBase);
  182. CloseLibrary(IntuitionBase);
  183. CloseLibrary(GfxBase);
  184. CloseLibrary(UtilityBase);
  185. CloseLibrary(DataTypesBase);
  186. CloseLibrary(SuperClassBase);
  187. CloseLibrary(JpegBase);
  188. CloseLibrary(RenderBase);
  189. }
  190.  
  191. IClass *ObtainClass(register __a6 ClassBase *cb)
  192. {
  193. return cb->cb_Class;
  194. }
  195.  
  196.